#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#include <string.h>
#define NUM 100
#define OPT_NUM 20
char LineCommend[NUM];
char* myargv[OPT_NUM];//指针数组，用于记录切割出来的字符串
int main()
{   
    while(1)
    {
        printf("用户名@主机名 当前路径:");
        fflush(stdout);
        //获取输入内容
        char* s=fgets(LineCommend,sizeof(LineCommend),stdin);
        assert(s!=NULL);
        //清除最后一个\n
        LineCommend[strlen(LineCommend)-1]=0;
        //字符串切割
        myargv[0]=strtok(s," ");
        int i=1;
        if(myargv[0]!=NULL&&strcmp(myargv[0],"ls")==0)
        {
            myargv[i++]=(char*)"--color=auto";
        }
        while(myargv[i++]=strtok(NULL," "));//如果切割完毕，strtok会返回NULL，刚好myargv[end]需要等于NULL
        if(myargv[0]!=NULL&&strcmp(myargv[0],"cd")==0)
        {
            if(myargv[1]!=NULL)
            {
               chdir(myargv[1]);//使用chdir改变父进程的当前路径
               continue;
            }
        }
        //测试是否成功
#ifdef DEBUG 
        for(i=0;myargv[i];++i)
        {
            printf("myargv[%d]:%s\n",i,myargv[i]);
        }
#endif
        //执行命令
        pid_t id=fork();//创建子进程，让子进程去执行命令
        assert(id!=-1);
        if(id==0)
        {
            execvp(myargv[0],myargv);
            exit(1);
        }
        waitpid(id,NULL,0);
    }
    return 0;
}
